const http = require('http');
const fs = require('fs');
const path = require('path');
//const contentType = require('./contentType.json');	//contentType常用对照表
const contentType = {	//这里把contentType常用对照表展开，免得再使用单独的contentType.json文件
	".txt":"text/plain",
	".asp":"text/asp",
	".php":"text/x-php",
	".css":"text/css",
	".js":"application/javascript",
	".json":"text/json",
	".pdf":"application/pdf",
	".doc":"application/msword",
	".jpg":"image/jpeg",
	".jpeg":"image/jpeg",
	".png":"image/png",
	".gif":"image/gif",
	".bmp":"image/x-ms-bmp",
	".tiff":"image/tiff",
	".svg":"text/xml",
	".xml":"text/xml",
	".mp4":"video/mpeg4",
	".webm":"video/webm",
	".3gp":"video/3gpp",
	".mp3":"audio/mpeg",
	".xls":"application/vnd.ms-excel",
	".xlsx":"application/vnd.ms-excel"
}

//读取当前文件的绝对路径（本文件和项目文件放到同一目录）
const documentRoot = __dirname;

//自己配置项目文件的存放路径
//const documentRoot = "C:\";

let server= http.createServer((req,res)=>{

    //客户端输入的url，例如如果输入localhost:8888/index.html
    //那么这里的url== /index.html 
	//这里配置了默认文件路径为/index.html
	//以下配置的"?from="用于微信转发时携带的参数
    let url = req.url=="/"||req.url.includes('?from=')?"/index.html":req.url;
	//将URLcode转为中文，解决中文图片404问题
	let file = documentRoot + decodeURIComponent(url);

    /*
		读取文件
        一参为文件路径
        二参为回调函数
            回调函数的一参为读取错误返回的信息，返回空就没有错误
            二参为读取成功返回的文本内容
    */
    fs.readFile( file , (err,data)=>{
        if(err){
            res.writeHeader(404,{
                'content-type' : 'text/html;charset="utf-8"'
            });
            res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
            res.end();
        }else{
			//这里判定请求的是网页还是其他文件
			//如果文件过多，可以用fs模块识别文件的类型，以便设置不同的content-type
			//使用常用Content-Type对照表中的类型设置（这里自己做了一个contentType.json）
			//获取请求文件的后缀
			let ext = path.extname(url),
				ct = contentType[ext];
			
			if(ct){
				//如果为文本，则设置utf-8编码
				let thisCt = ct.startsWith('text')?(ct+';charset="utf-8"'):ct;
				res.writeHeader(200,{
					'content-type' : thisCt
				});
			}else{	//其他一律用网页
				res.writeHeader(200,{
					'content-type' : 'text/html;charset="utf-8"'
				});
			}
            res.end(data);
        }
    });

}).listen(80);

console.log('Server running on port 80');

//linux后台执行：`nohup node xxx.js`
//windows后台执行：使用pm2插件
//由于使用pm2,可配置日志时间戳,所以这里所有console.log或错误日志均无需添加时间